無論是哪個語言,掌握型別的特性都是非常重要的基本功。這點在 JavaScript 中尤其重要,當不了解型別的特性時,總是會在意想不到的地方被 JavaScript 的地雷炸個粉身碎骨,然而當你暸若指掌時,你便能寫出更為優雅的JavaScript 程式。
讓我們複習一下 JavaScript 原始型別有哪些:
今天我們就要來深入了解每個原始型別的特性。
利用 '' 或者 "" 將字串包起來,就會是 string 的字面值
var myString = 'hello world';
String 的索引就是物件的屬性
String 物件是由 索引 跟 字元 組成的,舉例來說:
var myStringObj = String('hello world');
有沒有覺得跟 Object 的字面值很像呢? 沒錯,String 物件的索引就是物件的屬性,我們可以把他想成:
{
    0: 'h',
    1: 'e',
    2: 'l',
    3: 'l',
    4: 'o',
    5: ' ',
    6: 'w',
    7: 'o',
    8: 'r',
    9: 'l',
    10: 'd'
}
因此我們便能夠利用屬性讀取 string 的每個字元:
myString[0] = 'h';
接著再複習一次 原始型別概述篇提過的事情:讀取原始型別屬性時會觸發強制轉型
var myString = 'hello world';
console.log(myString[0]);				// "h"
console.log(myString[5]);				// " "
console.log(myString[11]);				// "d"
也就是不論是 string 原始型別,或是 string 物件,我們都可以利用索引拿到各個字元。
number 的字面值有很多種,包括
var myNumber = 100,
	myNegativeNumber = -100,
	myfloatNumber = 0.3,
	myOctal = 012,						// 10
	myHex = 0xFF,						// 255
	myScientificNotation = 513e-5,		// 513e-5
	myInfinity = Infinity,
	myNaN = NaN;
Number(),+()
Number('0100');			// 100
Number('0100.1');		// 100.1
Number('100abc');		// NaN
Number(undefined);		// NaN
+'0100';				// 100
+'0100.1';				// 100.1
+'100abc';				// NaN
+undefined;				// NaN
parseInt ()
parseInt('0100');				// 100
parseInt('0100', 8);			// 64
parseInt('0100.1');				// 100
parseInt('100abc');				// 100
parseInt(undefined);			// NaN
parseFloat()
強制轉型為 十進位浮點數
可以 parse 科學記號
遇到非數字時會只把前面的數字 parse 出來
parseFloat('0100');				// 100
parseFloat('0100.1');			// 100.1
parseFloat('100abc');			// 100
parseFloat(undefined);			// NaN
JavaScript 浮點數運會有誤差值
因為是依據 IEEE 754 的雙精度 (64位元) 去做轉換,因此在做浮點數運算的時候最好搭配 parseFloat() 與  toFixed() 來確保正確性。
0.1 + 0.2 = 0.30000000000000004;
0.1 + 0.2 === 0.3;									// false
parseFloat((0.1 + 0.2).toFixed(10)) === 0.3;		// true
NaN
NaN (Not a Number) 卻屬於 Number
typeof NaN;			// number
NaN 不等於 NaN,不論是用 === 或 ==
NaN === NaN			// false
NaN == NaN			// false
boolean總共只會有兩種值:true & false,雖然看似簡單,但使用它的精隨可以讓你的程式優雅許多。
boolean 的 字面值就是 true 或者 false 。
var myBoolean = true;
var myBoolean = false;
除此之外,我們也能夠把其他型別的變數強制轉型為 boolean,如果其他型別,則我們會
在 JavaScript 中,有非常多的方法可以將值強制轉型為 boolean,以下將列舉幾種常用的
Boolean(value):
強制轉型為 boolean
Boolean('hello world');		// true
!!value:
Boolean(value) 的語法糖衣
!!'hello world';			// true
!value:
反向強制轉型為 boolean
!'hello world';			// false
除此之外,也會有很多的邏輯判斷會觸發強制轉型,其中最常見就是
if (value):
大家都知道 if () 是用 true、false 來判斷是否要執行內部的邏輯,在 JavaScript 中,如果我們把非 boolean 值放入 if () 裡面就會觸發強制轉型
var hello = 'hello world';
if (hello) {
	console.log(hello);		// "hello world"
}
如果一個值被強制轉型為 boolean 的結果為 false 的話,則我們就稱此值為 falsy。
在 JavaScript 中,只有以下五種值為 falsy:
!!false				// false
!!0					// false
!!''				// false
!!null				// false
!!undefined			// false
!!NaN				// false
如果一個值被強制轉型為 boolean 的結果為 true 的話,則我們就稱此值為 truthy。
除了 falsy 的五種值以外,都是 truthy。
!!' ';				// true
!!1;				// true
!!-Infinity;		// true
!!{};				// true
!![];				// true
善用 truthy & falsy 技巧可以讓你的程式更簡潔明瞭
範例 1:
舉個例子來說,假如今天你傳入了一個參數,而你確定參數只可能會是 string或 undefined 的話,那如果要做以下的判斷:
if ((value === undefined) && (value === '')) {
	// do something
}
那不如就簡化成:
if (!value) {
	// do something
}
更為優雅
範例 2:
或說你要回傳一個 boolean 值
function returnBoolean() {
  	// ..
	return !Boolean(value1) && !Boolean(value2);
}
相當於:
function returnBoolean() {
  	// ..
	return !value1 && !value2;
}
利用語法糖衣可以有效提高易讀性。
代表沒有值,是 JavaScript 的預設值
undefined 的指派方式很簡單,直接將 undefined 指派給變數,或者乾脆不要給值
var nothing = undefined;
console.log(nothing);			// undefined
var nothingInside;
console.log(nothingInside);		// undefined
有沒有發現這邊並沒有說 var nothing = undefined 是一個字面值呢? 其實程式中直接寫明的 undefined 是一個全域變數,他內部的值就是 undefined,而它屬於 undefined 型別。因此若你直接指派 undefined 給一個變數,這並不會是 字面值的宣告方式,而會是將 undefined 全域變數指派給另一個變數的動作。可以參考:
https://msdn.microsoft.com/zh-tw/library/dae3sbk5
在 JavaScript 中,NULL代表"無"
null 的字面值就是 null。
var nothing = null;
typeof null 是 object
typeOf null 			// "object"
算是 JavaScript 的 Bug,容易讓人誤會也不合邏輯,因此務必不要拿 null 來做 typof 的判斷。
null 是人為賦予的值,而非 JavaScript 賦予的預設值
當你看到一個 變數/屬性 為 null 時,就代表他一定有個地方被指派為 null 過,因為不像是 undefined 代表 JavaScript 的預設值。如果在非預期的狀況下看到 null 的話,這個概念可以作為 debug 的依據。
因為大部分程式都有 null,因此 null 是 JSON-Safe
避免使用 typeOf null
如前一篇所提,typeOf null === "object",如果你不清楚這個特性,或者將其他程式的 null 使用方式帶入 JavaScript 的話,就很可能出錯。如果你很清楚這個特性的話,那你更不應該用了,畢竟你應該不會想將自己的程式建立在一個讓人容易誤會的 JavaScript 古老 Bug 上吧?
此篇介紹了 JavaScript 中,每個原始型別的特性與注意事項
typeof null === "object"
undefined
了解每個型別的特性有助於避開地雷提高程式的品質,如此,你便能寫出更為優雅的JavaScript 程式。
https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Guide/Grammar_and_types
https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/A_re-introduction_to_JavaScript
https://www.fooish.com/javascript/number/